
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>日志框架 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>日志框架 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">当程序行为与预期不符时，开发人员除了单步调试外，还有哪种主要工具可以用来定位问题？这种工具主要记录了哪些信息？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">另一种主要工具是在特定的地方打印日志。日志记录了系统行为的时间、地点、状态等相关信息，能够帮助快速定位、诊断并解决问题。</div>
          </div>
          <div class="card-source">来源: 日志作用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">以log4j为例，请按优先级从高到低的顺序列出其定义的6个核心日志级别。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">优先级从高到低依次为：FATAL、ERROR、WARN、INFO、DEBUG、TRACE。</div>
          </div>
          <div class="card-source">来源: 日志信息级别</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">什么是日志门面（Log Facade）？文档中介绍了哪两种主要的Java日志门面？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">日志门面是一个只提供日志API（接口）而不提供具体实现的框架。应用程序通过调用门面API来记录日志，在运行时再动态绑定具体的日志实现框架。文档中介绍的两种主要日志门面是JCL (commons-logging) 和 SLF4J。</div>
          </div>
          <div class="card-source">来源: 3.4 JCL, 3.5 Slf4j, 3.8 小结</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Logback和SLF4J之间是什么关系？为什么说Logback是SLF4J的原生实现？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Logback是由SLF4J的作者Ceki Gülcü亲自开发的日志实现框架，它完美地、原生实现了SLF4J的接口。相比之下，早期的其他日志框架（如Log4j）需要通过桥接包才能与SLF4J配合使用，因此Logback被称为SLF4J的原生或“正统”实现。</div>
          </div>
          <div class="card-source">来源: 3.6 Logback</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">文档中列举了Logback相较于log4j的多个优点，请至少列出其中三个。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到的优点包括：更快的执行速度、更充分的测试、非常自然地实现了SLF4J、自动重新载入配置文件、优雅地从I/O错误中恢复、自动清除旧的日志归档文件、自动压缩归档日志文件等。（列出任意三个即可）</div>
          </div>
          <div class="card-source">来源: 3.6 Logback</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Log4j中，如果希望日志文件能够根据日期或文件大小进行分割归档，应该使用哪两个具体的Appender类？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 根据日期分割：应使用 `org.apache.log4j.DailyRollingFileAppender`，它可以每天产生一个新的日志文件。<br>2. 根据文件大小分割：应使用 `org.apache.log4j.RollingFileAppender`，当文件大小达到指定尺寸时会产生一个新的文件。</div>
          </div>
          <div class="card-source">来源: 4.2  Appender 参数值</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Log4j的配置文件中，`ConversionPattern`参数的作用是什么？其中`%d`、`%p`、`%m`和`%n`分别代表什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`ConversionPattern`用于指定日志输出的格式。<br>- `%d`: 输出日志时间点的日期或时间。<br>- `%p`: 输出日志信息优先级，即DEBUG，INFO等。<br>- `%m`: 输出代码中指定的消息，即产生的具体日志信息。<br>- `%n`: 输出一个回车换行符。</div>
          </div>
          <div class="card-source">来源: 4.1.2 配置文件</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Spring Boot推荐并且默认使用的日志系统是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Boot推荐并且默认使用的日志系统是Logback。</div>
          </div>
          <div class="card-source">来源: SpringBoot+Sl4j+Logback</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">为了让Logback能够读取Spring的配置信息（例如`application.yml`中的属性），Logback的配置文件需要如何命名？为什么需要这样做？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Logback的配置文件需要命名为`logback-spring.xml`。因为如果使用默认的`logback.xml`，Logback会在Spring容器加载之前就加载日志配置，导致无法读取到Spring的配置属性。使用`logback-spring.xml`可以确保它在Spring环境初始化之后被加载。</div>
          </div>
          <div class="card-source">来源: logback读取Spring配置信息</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
